<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // - 原型链继承:可以将父级生成的实例放置在原型链中
    // - 缺点：父类当中提供的属性方法全部都来原型链。这些数据和方法对于实例而言是共享的。容易造成数据的混乱。
    // {
    //     function Box(userName){
    //         this.userName = userName;
    //     }
    //     function Desk(){
    //         this.age = 12;
    //     }
    //     Desk.prototype = new Box("lisi");
    //     Desk.prototype.constructor = Desk;
    //     const obj = new Desk();
    //     // console.log(obj instanceof Desk);// true
    //     // console.log(obj.__proto__ === Desk.prototype);// true
    //     // console.log(obj.__proto__.constructor === Desk);// false
    //     console.log(obj.userName,obj.age);
    // }

    // - 冒充继承：借用构造函数继承:只能够继承父类当中的实例，不会继承原型。
    // - 缺点：无法继承父类的原型对象的。
    // {
    //     function Box(userName) {
    //         this.userName =  userName;
    //     }
    //     Box.prototype.fn = function(){
    //
    //     }
    //
    //     function Desk() {
    //         this.age = 10;
    //         Box.apply(this,Array.from(arguments))
    //     }
    //
    //     const obj = new Desk("wangwu");
    //     console.log(obj);
    // }


    // - 原型链+借用构造函数的组合继承
    {
        function Box(userName) {
            this.userName =  userName;
        }
        Box.prototype.fn = function(){

        }

        function Desk() {
            this.age = 10;
            Box.apply(this,Array.from(arguments))
        }
        Desk.prototype = Box.prototype;
        Desk.prototype.constructor = Desk;

        const obj = new Desk("wangwu");
        console.log(obj);
    }
</script>
</html>